package gxa.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Component
public class MyZuulFilter extends ZuulFilter {
    @Override
    public String filterType() {
          /*
            filterType方法返回一个字符串代表过滤器的类型，在zuul中定义了四种不同生命周期的过滤器类型，具体如下：
            pre：路由之前
            routing：路由之时
            post： 路由之后
            error：发送错误调用
         */
        return "pre";
    }

    @Override
    public int filterOrder() {
          /*
             filterOrder方法代表过滤的顺序
         */
        return 0;
    }

    @Override
    public boolean shouldFilter() {
          /*
             shouldFilter方法可以写逻辑判断，是否要过滤，true代表永远过滤
         */
//        开启过滤
        return true;
    }

    @Override
    public Object run() throws ZuulException {
          /*
            run方法代表自定义逻辑，可以调用sql或nosql来判断权限处理等，
            run方法默认返回null，如果在返回之前输出自定义响应数据，调用ctx.setSendZuulResponse(false);则结束路由，不会向服务消费发起请求
         */
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        HttpServletResponse response = ctx.getResponse();

        System.out.println("到这里没有？？？？？？？？？？==========================");
        System.out.println("url=" + request.getRequestURL().toString() + " method=" + request.getMethod());
        String accessToken = (String) request.getParameter("token");
        if (accessToken == null || "".equals(accessToken)) {
            try {
                // 终止路由，直接返回客户端信息
                ctx.setSendZuulResponse(false);  // 设置为false，终止路由
                ctx.setResponseStatusCode(500);
                response.setContentType("text/html;charset=utf-8");
                PrintWriter out = ctx.getResponse().getWriter();
                out.write("{'code':500,'msg':'没有token'}");
                out.flush();
                out.close();

            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("这里这？");
                //不放行，返回结果
                // 终止路由，直接返回客户端信息
                ctx.setSendZuulResponse(false);
                ctx.setResponseStatusCode(500);
            }
        }

        System.out.println("终止错误");
        return null;
    }
    }
